from flask import current_app, jsonify, abort, g, render_template, request
from info import constants, db
from info.models import News, Comment
from . import news_blu
from info.utils.common import user_login_data
from info.utils.response_code import RET


# 评论功能的视图函数
@news_blu.route('/news_comment',methods=['POST'])
@user_login_data
def news_comment():

    # 评论需要登陆,先判断用户是否登陆
    user = g.user
    if not user:
        return jsonify(errno=RET.SESSIONERR,errmsg='用户未登陆')

    # 获取参数
    news_id = request.json.get('news_id')
    comment_str = request.json.get('comment')
    parent_id = request.json.get('parent_id')
    # 校验参数
    if not all([news_id, comment_str]):
        return jsonify(errno=RET.PARAMERR,errmsg='参数不全')
    # 逻辑处理(查询数据库 判断当前数据是否存在)
    try:
        news = News.query.get(news_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DATAERR,errmsg='数据库错误')
    if not news:
        return jsonify(errno=RET.NODATA,errmsg='没有数据')

    # 初始化模型, 保存数据
    comment = Comment()
    comment.user_id = user.id
    comment.news_id = news_id
    comment.content = comment_str
    if parent_id:
        comment.parent_id = parent_id

    # 提交数据
    try:
        db.session.add(comment)
        db.session.commit()
    except Exception as e:
        db.session.rollback()
        current_app.logger.error(e)
        return jsonify(errno=RET.DATAERR,errmsg='数据库错误')

    return jsonify(errno=RET.OK,errmsg='评论成功',data=comment.to_dict())

# 点击收藏取消的&删除添加的路由
@news_blu.route('/news_collect',methods=['POST'])
@user_login_data
def news_collect():

    # 1. 获取参数,如果需要登陆,还要获取用户信息
    user = g.user
    news_data = request.json
    # 获取新闻ID , 制定两个值,根据不同的值,做不同的逻辑处理
    news_id = news_data.get('news_id')
    action = news_data.get('action')
    # 2. 校验参数
    # 判断是否登陆了
    if not user:
        return jsonify(errno=RET.SESSIONERR,errmsg='用户未登录')

    news_list = ['collect', 'cancel_collect']
    if not all([news_id,action]):
        return jsonify(errno=RET.PARAMERR,errmsg='参数不全')
    if action not in news_list:
        return jsonify(errno=RET.DBERR,errmsg='参数不对')
    # 3. 逻辑处理
    # 查询当前
    try:
        news = News.query.get(news_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg='数据库查询失败')
    if not news:
       return jsonify(errno=RET.NODATA,errmsg='数据不存在')

    if action == 'cancel_collect':
        if news in user.collection_news:
            user.collection_news.remove(news)

    else:
        user.collection_news.append(news)

    # 手动提交数据
    try:
        db.session.commit()
    except Exception as e:
        db.session.rollback()
        current_app.logger.error(e)
        return jsonify(error=RET.DBERR,errmsg='保存数据失败')

    # 4. 返回数据
    return jsonify(errno=RET.OK,errmsg='成功')

# 新闻详情的显示路由
@news_blu.route('/<int:news_id>')
@user_login_data
def get_news(news_id):

    # 一. 登陆信息
    user = g.user

    # 二.查询点击排行榜的数据
    # 1. 查询数据库
    news_list = []
    try:
        news_list = News.query.order_by(News.clicks.desc()).limit(constants.CLICK_RANK_MAX_NEWS)
    except Exception as e:
        # 记录错误日志
        current_app.logger.error(e)

    news_dict_li = []
    for news in news_list:
        news_dict_li.append(news.to_review_dict())

    # 三.显示新闻详情
    # 1.查询数据库
    try:
        news = News.query.get(news_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.NODATA,errmsg='数据库错误')
    if not news:
        abort(404)

    # 每次点击让点击量+1,修改数据库需要提交数据
    news.clicks += 1
    db.session.commit()

    # 四.收藏信息
    is_collected = False
    if user:
        if news in user.collection_news:
            is_collected = True

    # 五显示评论信息
    # 1. 查询数据库
    comment_list = []
    try:
        comment_list = Comment.query.filter_by(news_id = news_id).order_by(Comment.create_time.desc()).all()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg='数据库查询失败')
    comment_dict_list = []
    for comment in comment_list:
        comment_dict_list.append(comment.to_dict())

    data = {
        'user':user.to_dict() if user else None,
        'news_dict_li':news_dict_li,
        'news':news.to_dict(),
        'is_collected':is_collected,
        'comments':comment_dict_list
    }
    # 返回数据
    return render_template('news/detail.html',data=data)